package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.entity.*;
import com.itheima.reggie.mapper.OrdersMapper;
import com.itheima.reggie.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 订单业务实现类
 */
@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements OrderService {

    @Autowired
    private ShoppingCartService cartService;

    @Autowired
    private AddressBookService bookService;

    @Autowired
    private UserService userService;

    @Autowired
    private OrderDetailService orderDetailService;


    @Override
    public void submit(Orders orders) {
        // 完成下订单的所有业务
        // 数据校验
        // 1.购物车无数据，不能下订单，用哪个业务对象
        Long userId = BaseContext.getCurrentId();
        LambdaQueryWrapper<ShoppingCart> cartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        cartLambdaQueryWrapper.eq(ShoppingCart::getUserId,userId);
        // 获取购物车列表
        List<ShoppingCart> shoppingCartList = cartService.list(cartLambdaQueryWrapper);
        if (shoppingCartList == null || shoppingCartList.size() == 0){
            throw new CustomException("购物车无数据，不能下订单");
        }

        // 2. 如果没收货地址，不能下订单，用哪个业务对象
        // 根据主键查询
        AddressBook addressBook = bookService.getById(orders.getAddressBookId());
        if (addressBook == null){
            throw new CustomException("没收货地址，不能下订单");
        }

        // 如果可以下订单，能想到那些？订单的数据在哪来
        // 订单要总价值，订单的数据来自购物车列表
        // 3.遍历当前用户的购物车(ShoppingCart)，
        // 计算总价值，并购物车数据转为订单详情(OrderDetail)
        AtomicInteger totalAmount = new AtomicInteger();
        // 程序产生一个唯一订单号
        Long orderId = IdWorker.getId();
        ArrayList<OrderDetail> orderDetailsList = new ArrayList<>();
        for (ShoppingCart cart:shoppingCartList){
            // 一条购物车数，就是一条详情
            OrderDetail orderDetail = new OrderDetail();
            BeanUtils.copyProperties(cart,orderDetail);
            // orderDetail缺少什么，订单详情属于一个订单
            orderDetail.setOrderId(orderId);
            // 价值，是当前这条记录的价值 BigDecimal类型
            BigDecimal amount = orderDetail.getAmount();
            BigDecimal subResult = amount.multiply(new BigDecimal(orderDetail.getNumber()));
            // 累计总价值
            totalAmount.addAndGet(subResult.intValue());

            orderDetailsList.add(orderDetail);
        }
        log.info("[订单-详情列表]，orderDetailsList：{}",orderDetailsList);
        log.info("[订单-总价值]orderId:{},totalAmount:{}",orderId,totalAmount.intValue());

        // 4.构建订单对象，orders，缺什么补什么
        orders.setId(orderId);
        // 订单的字符串变化，有规则 XXXXXXXX-XX-XX-XX
        orders.setNumber(orderId+"");
        orders.setOrderTime(LocalDateTime.now());
        orders.setCheckoutTime(LocalDateTime.now());
        orders.setAmount(new BigDecimal(totalAmount.get()));
        orders.setUserId(userId);
        orders.setStatus(1);
        // 订单的相关数据都初始化完成
        // 从产品确定，这个username，是下单人的名字，还是收货人的名字
        // 如果是下订单人的名字，从哪里获取？
        User currUser = userService.getById(userId);
        orders.setUserName(currUser.getName());
        // 设置收获信息，从哪里获取？前面已经获取了addressBook
        orders.setPhone(addressBook.getPhone());
        orders.setConsignee(addressBook.getConsignee());
        // 简单处理 省市区详细拼起来
        orders.setAddress(addressBook.getDetail());
        // 最终保存订单数据
        this.save(orders);
        // 最终保存订单详情，批量保存订单详情
        orderDetailService.saveBatch(orderDetailsList);
        // 如果订单OK，当前用户的购物车数据，是否还需要？
        // 清空购物车，查询条件，用户ID
        cartService.remove(cartLambdaQueryWrapper);
    }
}
